package com.example.mysql.学习笔记.高级.入门.逻辑架构.数据库缓冲池;

/**
 * 1.缓冲池(Buffer Pool)   缓存的是数据 和查询缓存完全不一样
 * 首先我们需要了解在InnoDB存储弓|擎中,缓冲池都包括了哪些。
 * 在InnoDB存储引擎中有一部分数据会放到内存中，缓冲池则占了这部分内存的大部分，
 * 它用来存储各种数据的缓存，InnoDB缓冲池有啥:
 *    数据页(16kb)   索引页    插入缓存
 *    锁信息   自适应索引哈希     数据字典信息
 *
 *  缓存池的重要性:
 * 对于使用InnoDB作为存储引擎的表来说，不管是用于存储用户数据的索引(包括聚簇索引和二级索引) ,还是
 * 各种系统数据，都是以页的形式存放在表空间中的，而所谓的表空间只不过是InnoDB对文件系统上一个或几个
 * 实际文件的抽象，也就是说我们的数据说到底还是存储在磁盘上的。但是各位也都知道，磁盘的速度慢的跟乌龟
 * -样,怎么能配得上“快如风，疾如电”的CPU呢?这里，缓冲池可以帮助我们消除CPU和磁盘之间的鸿沟。所以
 * InnoDB存储弓|擎在处理客户端的请求时，当需要访问某个页的数据时，就会把完整的页的数据全部加载到内存中,
 * 也就是说即使我们只需要访问一个页的一条记录，那也需要先把整个页的数据加载到内存中。将整个页加载到内
 * 存中后就可以进行读写访问了，在进行完读写访问之后并不着急把该页对应的内存空间释放掉,而是将其缓存起
 * 来，这样将来有请求再次访问该页面时，就可以省去磁盘I0的开销了。
 *
 * 缓存原则:
 * “位置*频次”这个原则，可以帮我们对I/0访问效率进行优化。
 * 首先，位置决定效率，提供缓冲池就是为了在内存中可以直接访问数据。
 * 其次，频次决定优先级顺序。因为缓冲池的大小是有限的，比如磁盘有200G,但是内存只有16G,
 * 缓冲池大小只有1G,就无法将所有数据都加载到缓冲池里，
 * 这时就涉及到优先级顺序,会优先对使用频次高的热数据进行加载。
 *
 * 缓冲池的预读特性:
 * 了解了缓冲池的作用之后,我们还需要了解缓冲池的另-个特性:预读。
 * 缓冲池的作用就是提升I/0效率,而我们进行读取数据的时候存在一个“ 局部性原理”，也就是说我们使用了一些
 * 数据，大概率还会使用它周围的一些数据 ，因此采用“预读的机制提前加载，可以减少未来可能的磁盘1/0操作。
 *
 * 2.查询缓存   以key value形式保存  8.0已删除
 * 那么什么是查询缓存呢?
 * 查询缓存是提前把查询结果缓存起来,这样下次不需要执行就可以直接拿到结果。需要说明的是，在MySQL中的
 * 查询缓存，不是缓存查询计划，而是查询对应的结果。因为命中条件苛刻，而且只要数据表发生变化，查询缓存
 * 就会失效,因此命中率低。
 * 缓冲池服务于数据库整体的1/0操作，它们的共同点都是通过缓存的机制来提升效率。
 *
 */
public class 缓冲池和查询缓存 {
}
